1 语法结构
主要由语法声明和规则组成。1
2
3
4
5
6
7
8
9
10
11
12/** Optional javadoc style comment */
grammar Name; ①
options {...}
import ... ;
tokens {...}
channels {...} // lexer only
@actionName {...}
rule1 // parser and lexer rules, possibly intermingled
...
ruleN
文件名称必须命名为${Name}.g4
至少包含文件头①和一条规则。
至多包含一个options、imports和tokens。可以交换顺序。
没有前缀的grammar将词法和解析规则结合。
可以添加lexer或parser区分。
只有lexer grammar可以包含mode和自定义的channel。
1 | channels { |
Channel可以在词法规则中像枚举值一样使用。
1 | WS : [ \r\t\n]+ -> channel(WHITESPACE_CHANNEL) ; |
2 Imports
类似面向对象的父类继承,当前值覆盖引入的同名值。
引入后的值视同当前文件的值,在异常信息中不会出现标记引入信息。
1 | $ antlr4 MyELang.g4 |
引入的tokens和actions将会合并。
不建议引入包含命名action和包含规则的action,否则影响复用。
忽略引入的options。
引入遵循深度优先规则。如以下规则r指代的G3中的r。
不同的grammar引入的grammar不同:
- lexer可以引入lexer
- parser可以引入parser
- combined可以引入parser和不包含mode的lexer
3 Tokens
用于定义没有关联词法规则的标识类型。
1 | tokens { Token1, ..., TokenN } |
1 | // explicitly define keyword token types to avoid implicit definition warnings |
1 | $ cat Tok.g4 |
4 语法级别的Actions
当前仅支持两个语法规则外的命名action: header和member。
前者引入代码到生成的识别器字节码文件,后者引入字段或方法到生成的识别器字节码文件。
可以使用parser或者lexer前缀,限制引入的目的地。
1 | grammar Count; |
Java类文件需要在foo目录中。
grammar文件在没有指定-o选项时,为了生成代码,也需要在foo目录中。